
#include <malloc.h>
#include "compresion.h"
#include "lz4.h"
#include "log.h"


/*
 * Implementación de funcion definida en cabecera
 */
struct DATOS_COMPRIMIDOS comprimir(char *datos, int longitudDatos) {

    int tamCabecera = sizeof(int);
    char *datosComp = malloc(LZ4_compressBound(longitudDatos)+tamCabecera);
    
    LOGGER("Comenzamos compresion");
        
    // Comprimir bloque
    int tamBloqueComp = LZ4_compress(datos, datosComp+tamCabecera, longitudDatos);
    ((int *)datosComp)[0] = longitudDatos;

    LOGGER("Fin compresion. Tam %d", ((int *)datosComp)[0]);

    // Empaquetamos el resultado y lo devolvemos
    struct DATOS_COMPRIMIDOS compresion;
    compresion.datosCompr = datosComp;
    compresion.longitudCompr = tamBloqueComp+tamCabecera;

    return compresion;
    
}


/*
 * Implementación de funcion definida en cabecera
 */
struct DATOS_DESCOMPRIMIDOS descomprimir(char *datos) {

    int tamCabecera = sizeof(int);
    int tamDescomp = ((int *)datos)[0]; // De la cabecera leemos el tamaño descomprimido
    char *datosDescomp = malloc(sizeof(char) * tamDescomp); // Reservamos la memoria
    
    LOGGER("Tam descomp %d", tamDescomp);
    
    // Descomprimimos el bloque
    int tamBloqueDesc = LZ4_uncompress(datos+tamCabecera, datosDescomp, tamDescomp);
    if (tamBloqueDesc == 0) {
        // TODO - logear
    }
    
    struct DATOS_DESCOMPRIMIDOS descompresion;
    descompresion.datos = datosDescomp;
    descompresion.longitud = tamDescomp;

    return descompresion;

}